﻿// ===============================================================================
// XCI.NET 西安交通信息WinForm开发框架 2018 版权所有
// ===============================================================================

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using XCI.Core;
using XCI.Sys.Model;
using XCI.Windows.Plugin.GridSetting;

namespace XCI.Sys
{
    /// <summary>
    /// 应用程序扩展接口
    /// <para>
    /// 框架封装了整个应该程序的启动过程，也实现了启动画面\系统更新\同步日期\全局异常等常规功能
    /// 简化了系统的开发，因此需要提供功能扩展接口，系统中把相关的扩展点都封装在此接口中。
    /// </para>
    /// </summary>
    public interface IApp
    {
        /// <summary>
        /// 读取应用程序配置
        /// <para>
        /// 定义应用程序在启动之初，如何读取系统配置信息，此函数是启动的第一步执行。
        /// </para>
        /// </summary>
        WinFormSetting GetSetting();

        /// <summary>
        /// 保存应用程序配置
        /// <para>
        /// 当系统配置信息发生变化时，如何保存系统配置信息。
        /// </para>
        /// </summary>
        /// <param name="setting">配置对象</param>
        void SaveSetting(WinFormSetting setting);

        /// <summary>
        /// 获取表格配置对象
        /// <para>
        /// 系统中对表格控件可以进行属性自定义，此函数返回表格配置信息操作类。
        /// </para>
        /// </summary>
        IGridSetting GetGridSetting();

        /// <summary>
        /// 获取登陆窗口
        /// <para>
        /// 定义系统登录窗口，如不需要登录，请返回null。
        /// </para>
        /// </summary>
        Form GetLoginForm();

        /// <summary>
        /// 获取主窗口
        /// <para>
        /// 定义系统主界面。不允许为null。
        /// </para>
        /// </summary>
        Form GetMainForm();

        /// <summary>
        /// 获取启动屏幕
        /// <para>
        /// 定义系统启动屏幕，必须遵守DevExpress组件启动屏幕规范。
        /// </para>
        /// </summary>
        Type GetSplashScreen();

        /// <summary>
        /// 获取等待窗体
        /// <para>
        /// 定义系统等待窗体，必须遵守DevExpress组件等待窗体规范。
        /// </para>
        /// </summary>
        Type GetWaitForm();

        /// <summary>
        /// 获取接口对象
        /// <para>
        /// 定义系统后台通讯接口操作对象。
        /// </para>
        /// </summary>
        /// <param name="setting">应用设置</param>
        WebApi GetApi(WinFormSetting setting);

        /// <summary>
        /// 用户登录
        /// <para>
        /// 定义用户登录过程。
        /// </para>
        /// </summary>
        /// <param name="account">账号</param>
        /// <param name="password">密码</param>
        /// <param name="captcha">验证码</param>
        /// <returns>成功返回True</returns>
        BoolMessage<SysUser> UserLogin(string account, string password, string captcha);

        /// <summary>
        /// 用户登录成功后触发
        /// </summary>
        void OnLoginSuccess();

        /// <summary>
        /// 验证用户
        /// <para>
        /// 验证用户账号密码是否正确，与登录函数不同的是，此函数只验证账号密码，而用户登录还会有其他安全相关的操作和日志记录。
        /// </para>
        /// </summary>
        /// <param name="account">账号</param>
        /// <param name="password">密码</param>
        /// <param name="captcha">验证码</param>
        /// <returns>成功返回True</returns>
        BoolMessage UserValid(string account, string password, string captcha);

        /// <summary>
        /// 获取用户拥有的模块集合
        /// <para>
        /// 获取当前用户拥有的系统模块集合。
        /// </para>
        /// </summary>
        /// <param name="user">用户对象</param>
        IList<SysModule> GetModules(SysUser user);

        /// <summary>
        /// 客户端与服务端网络测试
        /// <para>
        /// 客户端和服务端进行网络测试。
        /// </para>
        /// </summary>
        bool Ping();

        /// <summary>
        /// 客户端心跳
        /// <para>
        /// 激活当前用户，保持当前客户端在线。
        /// </para>
        /// </summary>
        /// <param name="id">当前应用或者用户标识</param>
        bool Active(string id);

        /// <summary>
        /// 全局处理异常
        /// <para>
        /// 定义系统全局异常处理，只有用户未处理的异常才会再此统一处理，如果用户在函数中编写try catch，则不会触发此函数。
        /// </para>
        /// </summary>
        /// <param name="e">异常对象</param>
        void GlobalExceptionProcess(Exception e);
    }
}